﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Word;
using System.IO;
namespace GZDL_DEV.DEL
{
    public class WordExport
      {
            private Application wordApp= null;

            private Document wordDoc= null;

            public  Application Application
            {
              get
              {
                return  wordApp;
              }
              set
              {
                wordApp = value;
              }
            }

            public  Document Document
            {
              get
              {
                return  wordDoc;
              }
              set
              {
                wordDoc = value;
              }
            }
              /// <summary>
            /// 通过模板创建新文档
              /// </summary>
              /// <param name="filePath"></param>
            public  void  CreateNewDocument(string  filePath)
            {
              killWinWordProcess();
              wordApp= new Application();
              wordApp.DisplayAlerts =WdAlertLevel.wdAlertsNone;
              wordApp.Visible =false;
              object missing =System.Reflection.Missing.Value;
              object templateName =filePath;
              wordDoc= wordApp.Documents.Open(ref templateName, ref missing,
                ref  missing, ref  missing,ref  missing, ref  missing, ref missing,
                ref  missing, ref  missing,ref  missing, ref  missing, ref missing,
                ref  missing, ref  missing,ref  missing, ref  missing);
            }

              /// <summary>
              /// 保存新文件
              /// </summary>
              /// <param name="filePath"></param>
            public  void  SaveDocument(string  filePath)
            {
              object fileName =filePath;
              object format =WdSaveFormat.wdFormatDocument;//保存格式
              object miss =System.Reflection.Missing.Value;
              wordDoc.SaveAs(ref fileName, ref  format, ref  miss,
                ref  miss, ref  miss,ref  miss, ref  miss,
                ref  miss, ref  miss,ref  miss, ref  miss,
                ref  miss, ref  miss,ref  miss, ref  miss,
                ref  miss);
              //关闭wordDoc，wordApp对象
              object SaveChanges =WdSaveOptions.wdSaveChanges;
              object OriginalFormat =WdOriginalFormat.wdOriginalDocumentFormat;
              object RouteDocument =false;
              wordDoc.Close(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
              wordApp.Quit(ref SaveChanges, ref OriginalFormat, ref RouteDocument);
            }
 
            /// <summary>
            /// 在书签处插入值
            /// </summary>
            /// <param name="bookmark"></param>
            /// <param name="value"></param>
            /// <returns></returns>
            public  bool InsertValue(string  bookmark, string  value)
            {
              object  bkObj =bookmark;
              if(wordApp.ActiveDocument.Bookmarks.Exists(bookmark))
              {
                wordApp.ActiveDocument.Bookmarks.get_Item(ref bkObj).Select();
                wordApp.Selection.TypeText(value);
                return  true;
              }
              return false;
            }
 
              /// <summary>
            /// 插入表格,bookmark书签
              /// </summary>
              /// <param name="bookmark"></param>
              /// <param name="rows"></param>
              /// <param name="columns"></param>
              /// <param name="width"></param>
              /// <returns></returns>
            public Table InsertTable(string bookmark, int rows, int columns,float width)
            {
              object miss =System.Reflection.Missing.Value;
              object oStart =bookmark;
              Range range =wordDoc.Bookmarks.get_Item(ref oStart).Range;//表格插入位置
              Table newTable =wordDoc.Tables.Add(range,rows, columns, ref  miss, ref miss);
              //设置表的格式
              newTable.Borders.Enable =1; //允许有边框，默认没有边框(为0时报错，1为实线边框，2、3为虚线边框，以后的数字没试过)
              newTable.Borders.OutsideLineWidth=WdLineWidth.wdLineWidth050pt;//边框宽度
              if(width != 0)
              {
                newTable.PreferredWidth=width;//表格宽度
              }
              newTable.AllowPageBreaks =false;
              return newTable;
            }
 
              /// <summary>
            /// 合并单元格 表名,开始行号,开始列号,结束行号,结束列号
              /// </summary>
              /// <param name="table"></param>
              /// <param name="row1"></param>
              /// <param name="column1"></param>
              /// <param name="row2"></param>
              /// <param name="column2"></param>
            public void  MergeCell(Microsoft.Office.Interop.Word.Table table, int row1, int column1,int row2, int column2)
            {
              table.Cell(row1,column1).Merge(table.Cell(row2,column2));
            }
 
            //设置表格内容对齐方式Align水平方向，Vertical垂直方向(左对齐，居中对齐，右对齐分别对应Align和Vertical的值为-1,0,1)
            public void  SetParagraph_Table(Microsoft.Office.Interop.Word.Table table, int Align, int Vertical)
            {
              switch(Align)
              {
                case -1:table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphLeft;break;//左对齐
                case 0: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphCenter;break;//水平居中
                case 1: table.Range.ParagraphFormat.Alignment=WdParagraphAlignment.wdAlignParagraphRight;break;//右对齐
              }
              switch(Vertical)
              {
                case -1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalTop;break;//顶端对齐
                case 0: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalCenter;break;//垂直居中
                case 1: table.Range.Cells.VerticalAlignment=WdCellVerticalAlignment.wdCellAlignVerticalBottom;break;//底端对齐
              }
            }
 
            //设置表格字体
            public void SetFont_Table(Microsoft.Office.Interop.Word.Table table, string  fontName, double size)
            {
              if(size != 0)
              {
                table.Range.Font.Size =Convert.ToSingle(size);
              }
              if(fontName !="")
              {
                table.Range.Font.Name =fontName;
              }
            }
 
            //是否使用边框,n表格的序号,use是或否
            public void UseBorder(int n,bool use)
            {
              if(use)
              {
                wordDoc.Content.Tables[n].Borders.Enable =1; //允许有边框，默认没有边框(为0时无边框，1为实线边框，2、3为虚线边框，以后的数字没试过)
              }
              else
              {
                wordDoc.Content.Tables[n].Borders.Enable =2; //允许有边框，默认没有边框(为0时无边框，1为实线边框，2、3为虚线边框，以后的数字没试过)
              }
            }
 
            //给表格插入一行,n表格的序号从1开始记
            public void AddRow(int n)
            {
              object miss =System.Reflection.Missing.Value;
              wordDoc.Content.Tables[n].Rows.Add(ref miss);
            }
 
            //给表格添加一行
            public void AddRow(Microsoft.Office.Interop.Word.Table table)
            {
              object miss =System.Reflection.Missing.Value;
              table.Rows.Add(ref miss);
            }
 
            //给表格插入rows行,n为表格的序号
            public void AddRow(int n, int rows)
            {
              object miss =System.Reflection.Missing.Value;
              Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];
              for(int i = 0; i < rows; i++)
              {
                table.Rows.Add(ref miss);
              }
            }
 
            //给表格中单元格插入元素，table所在表格，row行号，column列号，value插入的元素
            public void InsertCell(Microsoft.Office.Interop.Word.Table table, int row, int column,string  value)
            {
              table.Cell(row,column).Range.Text =value;
            }
 
            //给表格中单元格插入元素，n表格的序号从1开始记，row行号，column列号，value插入的元素
            public void InsertCell(int n, int row,int column, string  value)
            {
              wordDoc.Content.Tables[n].Cell(row,column).Range.Text =value;
            }
 
            //给表格插入一行数据，n为表格的序号，row行号，columns列数，values插入的值
            public void InsertCell(int n, int row,int columns, string [] values)
            {
              Microsoft.Office.Interop.Word.Table table = wordDoc.Content.Tables[n];
              for(int i = 0; i < columns; i++)
              {
                table.Cell(row,i + 1).Range.Text =values[i];
              }
            }
 
            //在书签处插入图片
            public void InsertPicture(string bookmark, string picturePath, float width, float hight)
            {
                object miss = System.Reflection.Missing.Value;
              object oStart =bookmark;
              object linkToFile =false;    //图片是否为外部链接
              object saveWithDocument =true; //图片是否随文档一起保存
              object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;//图片插入位置
              wordDoc.InlineShapes.AddPicture(picturePath,ref  linkToFile, ref  saveWithDocument, ref range);
              wordDoc.Application.ActiveDocument.InlineShapes[1].Width=width; //设置图片宽度
              wordDoc.Application.ActiveDocument.InlineShapes[1].Height=hight; //设置图片高度
            }
 
            //在书签位置插入一段文字,text为文字内容
            public void InsertText(string bookmark, string text)
            {
              object oStart =bookmark;
              object range =wordDoc.Bookmarks.get_Item(ref oStart).Range;
              Microsoft.Office.Interop.Word.Bookmarks wdBookmarks = wordDoc.Bookmarks;
              Microsoft.Office.Interop.Word.Bookmark wdBookmark = wdBookmarks.get_Item(ref oStart);
              Microsoft.Office.Interop.Word.Selection wdSel;
              wdBookmark.Select();
              wdSel = wordApp.Selection;
              wdSel.Text = text;
              wordDoc.Paragraphs.Last.Range.Text ="\n";
            }
 
            //杀掉winword.exe进程
            public void killWinWordProcess()
            {
              System.Diagnostics.Process[]processes=System.Diagnostics.Process.GetProcessesByName("WINWORD");
              foreach (System.Diagnostics.Process process in processes)
              {
                bool b = process.MainWindowTitle=="";
                if (process.MainWindowTitle =="")
                {
                  process.Kill();
                }
              }
            }
 
      }
}
